
/**
 * @author tongxin
 * @date 2024/4/21 16:00
 */
export class FixedFileInfo{

  /**
   * 定义常量LENGTH，表示某种固定长度，具体用途根据上下文确定
   */
   LENGTH = 52 as const;

  /**
   * 定义文件信息的固定魔数，用于标识文件格式
   */
   FIXED_FILE_INFO_MAGIC = 0xFEEF04BD as const;
    /**
     * 文件的签名，用于验证文件的完整性和真实性
     */
   signature:number;

    /**
     * 结构版本号，表示数据结构的版本
     */
   structVersion:number;

    /**
     * 文件版本号的高位和低位
     */
    fileVersionMS = [];
    fileVersionLS = [];

    /**
     * 产品版本号的高位和低位
     */
    productVersionMS = [];
    productVersionLS = [];

    /**
     * 文件标志掩码，用于确定文件标志位的有效位
     */
   fileFlagsMask:number;

    /**
     * 文件标志，表示文件的属性和状态
     */
   fileFlags:number;

    /**
     * 文件适用的操作系统类型
     */
   fileOS:number;

    /**
     * 文件类型，用于分类或识别文件
     */
   fileType:number;

    /**
     * 文件子类型，进一步细化文件类型
     */
   fileSubtype:number;

    /**
     * 文件日期的高位和低位，表示文件创建或最后修改的日期
     */
   fileDateMS:number;
   fileDateLS:number;

    /**
     * 偏移量，表示数据在文件中的位置
     */
   offset:number;


    constructor( dataReader:IPEFileReader,  offset:number) {
        this.offset = offset;
        const byteArray:IByteArray = dataReader.read(offset, LENGTH);
        this.signature = byteArray.readDWord();
        if (this.signature != FIXED_FILE_INFO_MAGIC) {
            throw new Error("FixedFileInfo signature error");
        }
        this.structVersion = byteArray.readDWord();
        this.readVersion(this.fileVersionMS, byteArray);
        this.readVersion(this.fileVersionLS, byteArray);
        this.readVersion(this.productVersionMS, byteArray);
        this.readVersion(this.productVersionLS, byteArray);

        this.fileFlagsMask = byteArray.readDWord();
        this.fileFlags = byteArray.readDWord();
        this.fileOS = byteArray.readDWord();
        this.fileType = byteArray.readDWord();
        this.fileSubtype = byteArray.readDWord();
        this.fileDateMS = byteArray.readDWord();
        this.fileDateLS = byteArray.readDWord();
    }

    readVersion( version:number[],  byteArray:IByteArray):void {
        for (let i = 1; i >= 0; i--) {
            version[i] = byteArray.readWord();
        }
    }

    /**
     * 获取结尾
     *
     * @return
     */
   getEndOffset():number {
        return offset + LENGTH;
    }


}
